home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 2000 November: Tool Chest / Dev.CD Nov 00 TC Disk 1.toast / Sample Code / Contributed / SpriteWorld / SpriteWorld Examples / Stars / Stars.c < prev    next >
Encoding:
C/C++ Source or Header  |  2000-10-06  |  10.1 KB  |  375 lines  |  [TEXT/CWIE]

  1. ///--------------------------------------------------------------------------------------
  2. // Stars.c
  3. //
  4. // By Vern Jensen. Created 9/2/96
  5. ///--------------------------------------------------------------------------------------
  6.  
  7. #include <SWFPSReport.h>
  8. #include <SWIncludes.h>
  9. #include <SWGameUtils.h>
  10.  
  11. #include "SWApplication.h"
  12. #include "Stars.h"
  13.  
  14.  
  15. #define    kFullScreenWindow            true        // Try me full screen!
  16. #define kWorldRectInset                0            // Make the SpriteWorld smaller?
  17. #define kSyncToVBL                    true        // Sync SpriteWorld to VBL?
  18. #define kMaxFPS                        0            // Set to 0 for unrestricted speed
  19.  
  20. #define kNumStars                    150
  21. #define kMinStarSpeed                1
  22. #define kMaxStarSpeed                3
  23.  
  24. #define kNumSprites                    2
  25. #define    kBaseSpriteMoveDelta        2
  26.  
  27. enum {kWhiteStars, kGrayStars, kColorStars};
  28.  
  29. #define kStarColor            kWhiteStars        // Use kWhiteStars, kGrayStars, or kColorStars
  30.  
  31.  
  32.  
  33. ///--------------------------------------------------------------------------------------
  34. // Globals
  35. ///--------------------------------------------------------------------------------------
  36.  
  37. SpriteWorldPtr    gSpriteWorldP;
  38. WindowPtr        gWindowP;
  39. StarArray        gStarArray[kNumStars];
  40.  
  41. SpritePtr        gSimpleSpriteArray[kNumSprites];
  42.  
  43.  
  44. ///--------------------------------------------------------------------------------------
  45. // Main
  46. ///--------------------------------------------------------------------------------------
  47.  
  48. void    main( void )
  49. {
  50.     Initialize(kNumberOfMoreMastersCalls);
  51.     Randomize();
  52.     
  53.     if ( SWHasSystem7() )
  54.     {
  55.         AllowKeyUpEvents();    // Part of SWGameUtils.c
  56.         SetCursor(*GetCursor(watchCursor));
  57.         HideControlStrip();
  58.         SWSetCleanUpFunction(MyCleanUpFunction);
  59.         
  60.         CreateSpriteWorld();
  61.         CreateSprites();
  62.         
  63.         SetCursor(&qd.arrow);
  64.         HideCursor();
  65.         
  66.         RunAnimation();
  67.         ShutDown();
  68.         
  69.         RestoreControlStrip();    // Call this after using HideControlStrip before quitting
  70.         RestoreEventMask();        // Call this after using AllowKeyUpEvents before quitting
  71.     }
  72.     else
  73.     {
  74.         CantRunOnThisMachine();
  75.     }
  76. }
  77.  
  78.  
  79. ///--------------------------------------------------------------------------------------
  80. // CreateSpriteWorld
  81. ///--------------------------------------------------------------------------------------
  82.  
  83. void    CreateSpriteWorld( void )
  84. {
  85.     Rect        worldRect, windRect;
  86.     RgnHandle    mBarUpdateRgn;
  87.     OSErr        err;
  88.     RGBColor    black = { 0x0000, 0x0000, 0x0000 };
  89.     
  90.     gWindowP = GetNewCWindow(kWindowResID, NULL, (WindowPtr)-1L);
  91.     
  92.     if (gWindowP != NULL)
  93.     {
  94.             // Allow it to run only in depths of 8 bits or greater.
  95.         if ( GetDepthFromWindow(gWindowP) < 8 )
  96.         {
  97.             SetCursor(&qd.arrow);
  98.             StopAlert(130, NULL);
  99.             ExitToShell();
  100.         }
  101.         
  102.         if (kFullScreenWindow == true)
  103.         {
  104.             SizeWindow(gWindowP, qd.screenBits.bounds.right, 
  105.                     qd.screenBits.bounds.bottom, false);
  106.             MoveWindow(gWindowP, 0, 0, false);
  107.         }
  108.         else
  109.         {
  110.                 // Center window in screen
  111.             windRect = gWindowP->portRect;
  112.             CenterRect(&windRect, &qd.screenBits.bounds);
  113.             MoveWindow(gWindowP, windRect.left, windRect.top, false);
  114.         }
  115.         
  116.         ShowWindow(gWindowP);
  117.         SetPort(gWindowP);
  118.         mBarUpdateRgn = SWHideMenuBar(gWindowP); // Must be done *after* showing window!
  119.         EraseRgn(mBarUpdateRgn);
  120.         
  121.         ForeColor(blackColor);
  122.         BackColor(whiteColor);
  123.     }
  124.     else
  125.         CantFindResource();
  126.     
  127.     
  128.     err = SWEnterSpriteWorld();
  129.     FatalError(err);
  130.     
  131.     
  132.     worldRect = gWindowP->portRect;
  133.     InsetRect(&worldRect, kWorldRectInset, kWorldRectInset);
  134.     
  135.     
  136.         // Create the sprite world
  137.     err = SWCreateSpriteWorldFromWindow(&gSpriteWorldP, (CWindowPtr)gWindowP, 
  138.             &worldRect, NULL, 0);
  139.     FatalError(err);
  140.     
  141.         // set to clear proc for extra speed
  142.     if ( gSpriteWorldP->pixelDepth >= 8 )
  143.         SWSetSpriteWorldOffscreenDrawProc(gSpriteWorldP, BlitPixieClearDrawProc);
  144.     else
  145.         SWSetSpriteWorldOffscreenDrawProc(gSpriteWorldP, SWStdWorldClearDrawProc);
  146.     
  147.     SWSetSpriteWorldScreenDrawProc(gSpriteWorldP, BlitPixieRectDrawProc);
  148.  
  149.     SWSetBackgroundColor( gSpriteWorldP, &black );
  150.     
  151.     SWSetSpriteWorldMaxFPS(gSpriteWorldP, kMaxFPS);
  152.     SWSyncSpriteWorldToVBL(gSpriteWorldP, kSyncToVBL);
  153.     SWSetCleanUpSpriteWorld(gSpriteWorldP);
  154. }
  155.     
  156.  
  157. ///--------------------------------------------------------------------------------------
  158. // CreateSprites
  159. ///--------------------------------------------------------------------------------------
  160.  
  161. void    CreateSprites( void )
  162. {
  163.     SpriteLayerPtr        spriteLayerP;
  164.     SpritePtr            simpleSpriteP;
  165.     DrawProcPtr            spriteDrawProc;
  166.     short                spriteNum;
  167.     OSErr                err;
  168.     
  169.     
  170.     err = SWCreateSpriteLayer(&spriteLayerP);
  171.     FatalError(err);
  172.  
  173.     err = SWCreateSpriteFromCicnResource(gSpriteWorldP, &simpleSpriteP, NULL, 
  174.             128, 1, kFatMask);
  175.     FatalError(err);
  176.     
  177. #if SW_68K
  178.         // Compiled Sprites are slightly faster than RLE Sprites.
  179.     SWCompileSprite(simpleSpriteP);
  180.     spriteDrawProc = BlitPixieCompiledSpriteDrawProc;
  181. #else
  182.         // However, Compiled Sprites are not available for PPC.
  183.     SWCreateRLEData(simpleSpriteP);
  184.     spriteDrawProc = BlitPixieRLEDrawProc;
  185. #endif
  186.     
  187.     gSimpleSpriteArray[0] = simpleSpriteP;
  188.  
  189.     for (spriteNum = 1; spriteNum < kNumSprites; spriteNum++)
  190.     {
  191.         err = SWCloneSprite(simpleSpriteP, &gSimpleSpriteArray[spriteNum], NULL);
  192.         FatalError(err);
  193.     }
  194.     
  195.  
  196.     for (spriteNum = 0; spriteNum < kNumSprites; spriteNum++)
  197.     {
  198.         simpleSpriteP = gSimpleSpriteArray[spriteNum];
  199.         
  200.         SWAddSprite(spriteLayerP, simpleSpriteP);
  201.         SWSetSpriteMoveBounds(simpleSpriteP, &gSpriteWorldP->backRect);
  202.         SWSetSpriteMoveProc(simpleSpriteP, BallSpriteMoveProc);
  203.         SWSetSpriteMoveDelta(simpleSpriteP, kBaseSpriteMoveDelta + spriteNum, 
  204.             kBaseSpriteMoveDelta + spriteNum);
  205.         SWSetSpriteLocation(simpleSpriteP, spriteNum * 60, spriteNum * 60);
  206.         SWSetSpriteDrawProc(simpleSpriteP, spriteDrawProc);
  207.     }
  208.     
  209.     SWAddSpriteLayer(gSpriteWorldP, spriteLayerP);
  210.     SWLockSpriteWorld(gSpriteWorldP);
  211.     
  212.     SWSetPortToBackground(gSpriteWorldP);
  213.     PaintRect(&gSpriteWorldP->backRect);
  214. }
  215.  
  216.  
  217. ///--------------------------------------------------------------------------------------
  218. //  RunAnimation
  219. ///--------------------------------------------------------------------------------------
  220.  
  221. void    RunAnimation( void )
  222. {
  223.     unsigned long        frames;
  224.     RGBColor            rgbColor;
  225.     long                blackIndex;
  226.     
  227.     rgbColor.red = rgbColor.blue = rgbColor.green = 0;
  228.     blackIndex = Color2Index(&rgbColor);
  229.     
  230.     SetUpStars();
  231.     SWUpdateSpriteWorld(gSpriteWorldP, true);
  232.     SWAnimateStarField(gSpriteWorldP, gStarArray, kNumStars, blackIndex);
  233.     
  234.     frames = 0;
  235.     StartTimer();
  236.     
  237.     FatalError( SWStickyError() ); // Make sure no errors got past us during setup
  238.     
  239.     while (!Button())
  240.     {
  241.         SWProcessSpriteWorld(gSpriteWorldP);
  242.         FatalError( SWStickyError() );    // Make sure no errors occurred during a MoveProc, etc.
  243.         SWAnimateSpriteWorld(gSpriteWorldP);
  244.         
  245.         if (gSpriteWorldP->frameHasOccurred)
  246.         {
  247.             MoveStars();
  248.             SWAnimateStarField(gSpriteWorldP, gStarArray, kNumStars, blackIndex);
  249.             
  250.             frames++;
  251.         }
  252.     }
  253.     
  254.     
  255.     SWShowMenuBar(gWindowP);
  256.     ShowResults(frames);
  257. }
  258.  
  259. #pragma mark -
  260.  
  261. ///--------------------------------------------------------------------------------------
  262. //  ShutDown (clean up and dispose of the SpriteWorld)
  263. ///--------------------------------------------------------------------------------------
  264.  
  265. void    ShutDown( void )
  266. {
  267.     SWDisposeSpriteWorld(&gSpriteWorldP);
  268.     SWExitSpriteWorld();
  269.     
  270.     FlushEvents(everyEvent, 0);
  271.     InitCursor();
  272. }
  273.  
  274.  
  275. ///--------------------------------------------------------------------------------------
  276. //  MyCleanUpFunction - called if an error occurs, to clean up before quitting
  277. ///--------------------------------------------------------------------------------------
  278.  
  279. void    MyCleanUpFunction( void )
  280. {
  281.     SWShowMenuBar(gWindowP);
  282.     
  283.     RestoreControlStrip();
  284.     RestoreEventMask();    
  285. }
  286.  
  287.  
  288. ///--------------------------------------------------------------------------------------
  289. //  BallSpriteMoveProc
  290. ///--------------------------------------------------------------------------------------
  291.  
  292. SW_FUNC void    BallSpriteMoveProc(SpritePtr ballSpriteP)
  293. {    
  294.     SWOffsetSprite(ballSpriteP, ballSpriteP->horizMoveDelta, ballSpriteP->vertMoveDelta);
  295.     (void)SWBounceSprite(ballSpriteP);
  296. }
  297.  
  298.  
  299. ///--------------------------------------------------------------------------------------
  300. //  SetUpStars
  301. ///--------------------------------------------------------------------------------------
  302.  
  303. void    SetUpStars( void )
  304. {    
  305.     short        curStar, value;
  306.     RGBColor    rgbColor;
  307.     long        colorIndex;
  308.     Rect        windRect = gSpriteWorldP->windowFrameP->frameRect;
  309.     
  310.     for (curStar = 0; curStar < kNumStars; curStar++)
  311.     {
  312.         if (kStarColor == kWhiteStars)
  313.         {
  314.             rgbColor.red = rgbColor.green = rgbColor.blue = 65535;
  315.         }
  316.         else if (kStarColor == kGrayStars)
  317.         {
  318.             value = GetUnsignedRandom(15000, 65534);
  319.             rgbColor.red = rgbColor.green = rgbColor.blue = value;
  320.         }
  321.         else
  322.         {
  323.             rgbColor.red = GetUnsignedRandom(0, 65534);
  324.             rgbColor.green = GetUnsignedRandom(0, 65534);
  325.             rgbColor.blue = GetUnsignedRandom(0, 65534);
  326.         }
  327.         
  328.         colorIndex = Color2Index(&rgbColor);
  329.         
  330.         gStarArray[curStar].horizLoc = GetRandom(windRect.left, windRect.right-1);
  331.         gStarArray[curStar].vertLoc = GetRandom(windRect.top, windRect.bottom-1);
  332.         gStarArray[curStar].oldHorizLoc = gStarArray[curStar].horizLoc;
  333.         gStarArray[curStar].oldVertLoc = gStarArray[curStar].vertLoc;
  334.         gStarArray[curStar].horizSpeed = GetRandom(kMinStarSpeed, kMaxStarSpeed);
  335.         gStarArray[curStar].color = colorIndex;
  336.         gStarArray[curStar].isOn = true;
  337.         
  338.             // Since the star hasn't been drawn yet, it doesn't need to be erased.
  339.         gStarArray[curStar].needsToBeErased = false;
  340.     }
  341. }
  342.  
  343.  
  344. ///--------------------------------------------------------------------------------------
  345. //  MoveStars
  346. ///--------------------------------------------------------------------------------------
  347.  
  348. void    MoveStars( void )
  349. {    
  350.     short    curStar;
  351.     Rect*    windRectP = &gSpriteWorldP->windowFrameP->frameRect;
  352.     
  353.     for (curStar = 0; curStar < kNumStars; curStar++)
  354.     {
  355.             // Save the old position
  356.         gStarArray[curStar].oldHorizLoc = gStarArray[curStar].horizLoc;
  357.         gStarArray[curStar].oldVertLoc = gStarArray[curStar].vertLoc;
  358.         
  359.         gStarArray[curStar].horizLoc += gStarArray[curStar].horizSpeed;
  360.         if (gStarArray[curStar].horizLoc > windRectP->right)
  361.         {
  362.             gStarArray[curStar].vertLoc = GetRandom( windRectP->top, windRectP->bottom-1 );
  363.             gStarArray[curStar].horizLoc -= (windRectP->right - windRectP->left);
  364.         }
  365.  
  366. /*        
  367.             // Change star color (try uncommenting this for a neat effect)
  368.         gStarArray[curStar].color++;
  369.         if (gStarArray[curStar].color >= 255)
  370.             gStarArray[curStar].color -= 255;
  371. */
  372.     }
  373. }
  374.  
  375.